package es.ucm.fdi.healthpred.controlador;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.filechooser.FileNameExtensionFilter;

import org.hibernate.Session;

import es.ucm.fdi.healthpred.controlador.excepciones.ExcepcionCapturaDatos;
import es.ucm.fdi.healthpred.controlador.excepciones.ExcepcionConexion;
import es.ucm.fdi.healthpred.controlador.excepciones.ExcepcionTransaccion;
import es.ucm.fdi.healthpred.controlador.utils.ConstantsString;
import es.ucm.fdi.healthpred.controlador.utils.StringsHP_BD;
import es.ucm.fdi.healthpred.controlador.utils.connection.SingletonConnectionManager;
import es.ucm.fdi.healthpred.modelo.beans.CondicionesResidencia;
import es.ucm.fdi.healthpred.modelo.beans.CondicionesTrabajo;
import es.ucm.fdi.healthpred.modelo.beans.HabitosAlimenticios;
import es.ucm.fdi.healthpred.modelo.beans.HabitosHigienicos;
import es.ucm.fdi.healthpred.modelo.beans.HabitosPerjudiciales;
import es.ucm.fdi.healthpred.modelo.beans.HechoClinico;
import es.ucm.fdi.healthpred.modelo.beans.Historial;
import es.ucm.fdi.healthpred.modelo.beans.Hobbie;
import es.ucm.fdi.healthpred.modelo.beans.Patologias;
import es.ucm.fdi.healthpred.modelo.beans.PerfilClinico;
import es.ucm.fdi.healthpred.modelo.beans.PerfilPersona;
import es.ucm.fdi.healthpred.modelo.beans.Persona;
import es.ucm.fdi.healthpred.modelo.beans.Resultado;
import es.ucm.fdi.healthpred.modelo.motor.MotorConsulta;
import es.ucm.fdi.healthpred.modelo.motor.MotorExplotacion;
import es.ucm.fdi.healthpred.vista.DatosCliente;
import es.ucm.fdi.healthpred.vista.FormAnadir;
import es.ucm.fdi.healthpred.vista.FormLogDesplegado;
import es.ucm.fdi.healthpred.vista.FormParamConsulta;
import es.ucm.fdi.healthpred.vista.FormPrincipal;
import es.ucm.fdi.healthpred.vista.FormSecundario;
import es.ucm.fdi.healthpred.vista.ModoAnadir;
import es.ucm.fdi.healthpred.vista.ModoFormParamConsulta;
import es.ucm.fdi.healthpred.vista.ModoFormSecundario;

/**
 * El <b>Controlador</b> se encarga de conectar a la vista y al modelo de datos,
 * para que interact&uacute;en siguiendo los conceptos asociados al
 * patr&oacute;n MVC. <br/>
 * Es una clase cuyos m&eacute;todos y atributos son todos est&aacute;ticos.
 * 
 * @since 1.0
 * 
 * @version 1.0
 * 
 * @author &Aacute;lvaro G&oacute;mez Porris
 * @author V&iacute;ctor L&oacute;pez Monte
 * @author Carlos Rodr&iacute;guez Colliga
 * 
 */
public class Controlador {

	/**
	 * Control del hecho actual.
	 */
	public static Integer codigoHecho = null;

	/**
	 * Control del dni actual.
	 */
	public static String dni = null;

	/**
	 * Formulario de consulta desplegado.
	 */
	public static FormLogDesplegado formLogDesp;

	/**
	 * Ids de historias a borrar en la BD.
	 */
	public static ArrayList<Integer> historiasDelete;

	/**
	 * Ids de hobbies a borrar de la BD.
	 */
	public static ArrayList<String> hobbiesDelete;

	/**
	 * Control del hobbie actual.
	 */
	public static String nombreHobbie = null;

	/**
	 * Sesi&oacute;n actual asociada a la conexi&oacute;n a la BD.
	 */
	public static Session sesion;

	/**
	 * Formulario para agregar datos.
	 * 
	 * @see FormAnadir
	 */
	public static FormAnadir vistaAnadir;

	/**
	 * Formulario secundario.
	 * 
	 * @see FormSecundario
	 */
	public static FormSecundario vistaSecundaria;

	/**
	 * Formulario de par&aacute;metros de <i>Alimento</i>
	 * 
	 * @see HabitosAlimenticios
	 */
	public static FormParamConsulta vistaParamAlimento = new FormParamConsulta(
			vistaSecundaria, ModoFormParamConsulta.M_ALIMENTO);

	/**
	 * Formulario de par&aacute;metros de <i>Higiene</i>
	 * 
	 * @see HabitosHigienicos
	 */
	public static FormParamConsulta vistaParamHigiene = new FormParamConsulta(
			vistaSecundaria, ModoFormParamConsulta.M_HIGIENE);

	/**
	 * Formulario de par&aacute;metros <i>Perjudiciales</i>
	 * 
	 * @see HabitosPerjudiciales
	 */
	public static FormParamConsulta vistaParamPerjudicial = new FormParamConsulta(
			vistaSecundaria, ModoFormParamConsulta.M_PERJUDICIAL);

	/**
	 * Formulario de par&aacute;metros de <i>Residencia</i>
	 * 
	 * @see CondicionesResidencia
	 */
	public static FormParamConsulta vistaParamResidencia = new FormParamConsulta(
			vistaSecundaria, ModoFormParamConsulta.M_RESIDENCIA);

	/**
	 * Formulario de par&aacute;metros de <i>Trabajo</i>
	 * 
	 * @see CondicionesTrabajo
	 */
	public static FormParamConsulta vistaParamTrabajo = new FormParamConsulta(
			vistaSecundaria, ModoFormParamConsulta.M_TRABAJO);

	/**
	 * Formulario principal.
	 * 
	 * @see FormPrincipal
	 */
	public static FormPrincipal vistaPrincipal = new FormPrincipal();

	/**
	 * Motor de consultas a la BD.
	 * 
	 * @see MotorConsulta
	 */
	public static MotorConsulta motorConsulta = new MotorConsulta();

	/**
	 * Motor de explotaci&oacute;n de las reglas de la BD.
	 * 
	 * @see MotorExplotacion
	 */
	public static MotorExplotacion motorExplotacion = new MotorExplotacion();

	/**
	 * Actualiza los <i>datos</i> del formulario que determine el <i>modo</i>.
	 * 
	 * @param datos
	 * @param modo
	 */
	public static void actualizaDatosFormParamConsulta(
			HashMap<String, Object> datos, ModoFormParamConsulta modo) {
		if (modo.equals(ModoFormParamConsulta.M_RESIDENCIA))
			vistaSecundaria.actualizaDatosResidencia();
		else if (modo.equals(ModoFormParamConsulta.M_TRABAJO))
			vistaSecundaria.actualizaDatosTrabajo();
		else if (modo.equals(ModoFormParamConsulta.M_ALIMENTO))
			vistaSecundaria.actualizaDatosAlimenticios();
		else if (modo.equals(ModoFormParamConsulta.M_HIGIENE))
			vistaSecundaria.actualizaDatosHigienicos();
		else if (modo.equals(ModoFormParamConsulta.M_PERJUDICIAL))
			vistaSecundaria.actualizaDatosPerjudiciales();
	}

	/**
	 * Muestra la ayuda en el formato y aplicai&oacute;n adecuadas (pdf o html).
	 * 
	 * @param pdf
	 */
	public static void ayuda(boolean pdf) {
		try {
			if (pdf) {
				Runtime.getRuntime().exec(
						"rundll32 url.dll, FileProtocolHandler "
								+ "doc\\help\\Ayuda.pdf");
			} else {
				Runtime.getRuntime().exec(
						"rundll32 url.dll, FileProtocolHandler "
								+ "doc\\help\\html\\Ayuda.html");
			}
		} catch (IOException e) {
			String titulo = ConstantsString.TITULO_ERROR;
			String msg = ConstantsString.ERROR_AYUDA;
			vistaPrincipal.ventanaInfo(msg, titulo);
			System.err.println("ERROR AL MOSTRAR LA AYUDA");
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	public static void borrarPatologiasPrevias() {

		try {
			MotorConsulta.borrarPatologiasPrevias(Controlador.dni);
		} catch (Exception e) {
			System.err.println(e);
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	public static void borrarResultadosPrevios() {

		try {
			MotorConsulta.borrarResultadosPrevios(Controlador.dni);
		} catch (Exception e) {
			System.err.println(e);
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	public static void borrarSintomasPrevios() {
		try {
			MotorConsulta.borrarSintomasPrevios(Controlador.dni);
		} catch (Exception e) {
			System.err.println(e);
			e.printStackTrace();
		}
	}

	/**
	 * Ordena al motor de consultas que realice una b&uacute;squeda y actualiza
	 * la vista en funci&oacute;n de los resultados obtenidos.
	 */
	public static void buscar(HashMap<String, Object> busquedaHM) {
		String titulo = ConstantsString.TITULO_ERROR;
		String msg = ConstantsString.ERROR_BUSCAR;
		int total;
		try {
			ArrayList<Object> listaPersonas = motorConsulta.buscar(busquedaHM);
			if (listaPersonas != null) {
				titulo = ConstantsString.TITULO_BUSQUEDA;
				msg = ConstantsString.TITULO_BUSQUEDA;
				total = listaPersonas.size();
				if (total == 0) {
					msg = ConstantsString.NO_ENCONTRADO;
				} else if (total == 1) {
					msg = ConstantsString.ENCONTRADO;
				} else {
					msg = ConstantsString.ENCONTRADOS_A + String.valueOf(total)
							+ ConstantsString.ENCONTRADOS_B;
				}
				vistaPrincipal.ventanaInfo(msg, titulo);
				vistaPrincipal.actualizaTabla(listaPersonas, true);
			}
		} catch (ExcepcionTransaccion e) {
			System.err.println("ERROR AL BUSCAR");
			vistaPrincipal.ventanaInfo(msg, titulo);
			e.printStackTrace();
		}
	}

	/**
	 * 
	 */
	public static void cierraVistaAnadir() {
		vistaAnadir.dispose();
	}

	/**
	 * @param modo
	 */
	public static void cierraVistaParams(ModoFormParamConsulta modo) {
		switch (modo) {
		case M_RESIDENCIA:
			vistaParamResidencia.setVisible(false);
			break;
		case M_TRABAJO:
			vistaParamTrabajo.setVisible(false);
			break;
		case M_ALIMENTO:
			vistaParamAlimento.setVisible(false);
			break;
		case M_HIGIENE:
			vistaParamHigiene.setVisible(false);
			break;
		case M_PERJUDICIAL:
			vistaParamPerjudicial.setVisible(false);
		}
	}

	/**
	 * 
	 */
	public static void cierraVistaSecundaria() {
		hobbiesDelete = null;
		historiasDelete = null;
		vistaSecundaria.dispose();
	}

	/**
	 * Establece la conexi&oacute;n con la base de datos.
	 */

	public static void conecta() {
		try {
			sesion = (Session) SingletonConnectionManager.getInstance()
					.getSession();
		} catch (ExcepcionConexion e) {
			vistaPrincipal.ventanaInfo(ConstantsString.ERROR_CONEXION,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL CONECTAR");
			e.printStackTrace();
		}
	}

	/**
	 * @param nivel
	 *            El nivel de consulta/inferencia
	 */
	public static void consultar(int nivel) {
		try {
			motorExplotacion.motor(Controlador.dni, nivel);
		} catch (ExcepcionTransaccion e) {
			vistaSecundaria.ventanaInfo(ConstantsString.ERROR_CONSULTAR,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL CONSULTAR EL CLIENTE");
			e.printStackTrace();
		}
	}

	/**
	 * Desconecta de la BD.
	 */
	public static void desconecta() {
		try {
			sesion = (Session) SingletonConnectionManager.getInstance()
					.getSession();
			if ((sesion != null) && (sesion.isOpen())) {
				sesion.close();
			}
		} catch (ExcepcionConexion e) {
			vistaPrincipal.ventanaInfo(ConstantsString.ERROR_CONEXION,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL DESCONECTAR");
			e.printStackTrace();
		}
	}

	/**
	 * Despliega el formulario de resultados.
	 * 
	 * @param panelLog
	 * @param btnSiguiente
	 */
	public static void despliegaLog(JTextPane panelLog, JButton btnSiguiente,
			JButton btnGuardar) {
		formLogDesp = new FormLogDesplegado(vistaSecundaria, panelLog,
				btnSiguiente, btnGuardar);
		formLogDesp.setVisible(true);
	}

	/**
	 * @param datosCliente
	 *            Los nuevos datos del cliente a editar.
	 */
	public static void editarCliente(DatosCliente datosCliente) {
		String msg = ConstantsString.EDITAR_CLIENTE;
		String titulo = ConstantsString.TITULO_ERROR;
		try {
			motorConsulta.editarCliente(datosCliente);
			cierraVistaAuxiliar_info(msg);
			ArrayList<Object> lista = motorConsulta.obtenTodosClientes();
			vistaPrincipal.actualizaTabla(lista, false);
		} catch (ExcepcionCapturaDatos e) {
			msg = ConstantsString.ERROR_EDITAR_CLIENTE;
			vistaSecundaria.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println("ERROR AL EDITAR CLIENTE");
			e.printStackTrace();
		} catch (ExcepcionTransaccion e) {
			msg = ConstantsString.ERROR_EDITAR_CLIENTE;
			vistaSecundaria.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println("ERROR AL EDITAR CLIENTE");
			e.printStackTrace();
		}
	}

	/**
	 * @param historia
	 *            Los nuevos datos de la historia a editar.
	 */
	public static void editarHistoria(Historial historia) {
		cierraVistaAnadir_info(ConstantsString.EDITAR_HECHO);
		vistaSecundaria.actualizaHistoria(historia);
		vistaSecundaria.actualizaTabla();
	}

	/**
	 * @param hobbie
	 *            Los nuevos datos del hobbie a editar.
	 * 
	 */
	public static void editarHobbie(Hobbie hobbie) {
		cierraVistaAnadir_info(ConstantsString.EDITAR_HOBBIE);
		vistaSecundaria.actualizaHobbie(hobbie);
		vistaSecundaria.actualizaTabla();
	}

	/**
	 * Elimina el cliente actual (determinado por el dni actual del
	 * Controlador).
	 */
	public static void eliminarCliente() {
		String titulo = ConstantsString.TITULO_ELIMINAR;
		String msg = ConstantsString.ADVERTENCIA;
		int opcion = vistaPrincipal.ventanaOpcion(msg, titulo);
		if (opcion == JOptionPane.YES_OPTION) {
			titulo = ConstantsString.TITULO_INFO;
			msg = ConstantsString.CLIENTE_ELIMINADO;
			try {
				motorConsulta.eliminarCliente();
				vistaPrincipal.ventanaInfo(msg, titulo);
				ArrayList<Object> lista = motorConsulta.obtenTodosClientes();
				vistaPrincipal.actualizaTabla(lista, false);
			} catch (ExcepcionTransaccion e) {
				titulo = ConstantsString.TITULO_ERROR;
				msg = ConstantsString.ERROR_ELIMINAR_CLIENTE;
				vistaPrincipal.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
				System.err.println("ERROR AL ELIMINAR CLIENTE");
				e.printStackTrace();
			}
		}
	}

	/**
	 * Guarda los resultados de la inferencia.
	 * 
	 * @param nombre
	 *            Nombre completo del cliente.
	 * @param dni
	 *            DNI del cliente.
	 * 
	 */
	public static void guardaResultado(String dni, String nombre) {
		Date fechaActual = new Date();
		JFileChooser chooser;
		String dirUsuario = System.getProperty("user.home");
		if (dirUsuario != null) {
			chooser = new JFileChooser(dirUsuario);
		} else {
			chooser = new JFileChooser();
		}
		String texto = vistaSecundaria.getTextoPanelLog();
		final FileNameExtensionFilter filtro = new FileNameExtensionFilter(
				"Archivo txt", "txt");
		chooser.setFileFilter(filtro);
		chooser.setDialogTitle("Guardar inferencia");
		int returnVal = chooser.showSaveDialog(vistaSecundaria);
		if (returnVal == JFileChooser.APPROVE_OPTION) {
			String path = chooser.getSelectedFile().getAbsolutePath();
			if (!(path.endsWith(".txt"))) {
				path += ".txt";
			}
			FileWriter file;
			PrintWriter print;
			try {
				file = new FileWriter(path, false);
				print = new PrintWriter(file);
				print.println(ConstantsString.CIUDAD_ACTUAL + ", "
						+ StringsHP_BD.fechaHP(fechaActual) + " - "
						+ StringsHP_BD.horaHP(fechaActual));
				print.println();
				print.println("-------- DATOS DEL CLIENTE --------");
				print.println("- DNI:" + dni);
				print.println("- NOMBRE: " + nombre);
				print.println();
				print.println();
				print.println();
				print.write(texto);
				print.flush();
				print.close();
			} catch (IOException e) {
				vistaSecundaria.ventanaInfo(ConstantsString.ERROR_GUARDAR,
						ConstantsString.TITULO_ERROR);
				System.err.println("ERROR AL GUARDAR");
				e.printStackTrace();
			}

		}
	}

	/**
	 * 
	 */
	public static void habilitaDesplegar() {
		vistaSecundaria.habilitaDesplegar();
	}

	/**
	 * 
	 */
	public static void inhabilitaVistasParams() {
		vistaParamResidencia.inhabilitaComponentes();
		vistaParamTrabajo.inhabilitaComponentes();
		vistaParamAlimento.inhabilitaComponentes();
		vistaParamHigiene.inhabilitaComponentes();
		vistaParamPerjudicial.inhabilitaComponentes();
	}

	/**
	 * Muestra todos los clientes del sistema en la vista principal.
	 * 
	 * @see FormPrincipal
	 */
	public static void muestraTodosClientes() {
		try {
			ArrayList<Object> lista = motorConsulta.obtenTodosClientes();
			vistaPrincipal.actualizaTabla(lista, false);
		} catch (ExcepcionTransaccion e) {
			vistaPrincipal.ventanaInfo(e.getMessage(),
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL MOSTRAR TODOS LOS CLIENTES");
			e.printStackTrace();
		}
	}

	/**
	 * @param datos
	 */
	public static void nuevasVariables(HashMap<String, Object> datos) {
		String titulo = ConstantsString.TITULO_ERROR;
		String msg = ConstantsString.ERROR_ANYADIR_VARIABLE;
		try {
			MotorConsulta.nuevasVariables(datos);
		} catch (Exception e) {
			vistaAnadir.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println(msg);
			e.printStackTrace();
		}
	}

	/**
	 * Crea un nuevo cliente en la BD.
	 * 
	 * @param datosCliente
	 */
	public static void nuevoCliente(DatosCliente datosCliente) {
		String msg = ConstantsString.ANYADIR_CLIENTE;
		String titulo = ConstantsString.TITULO_ERROR;
		try {
			motorConsulta.nuevoCliente(datosCliente);
			cierraVistaAuxiliar_info(msg);
			ArrayList<Object> lista = motorConsulta.obtenTodosClientes();
			vistaPrincipal.actualizaTabla(lista, false);
		} catch (ExcepcionCapturaDatos e) {
			msg = ConstantsString.ERROR_ANYADIR_CLIENTE;
			vistaSecundaria.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println("ERROR AL AGREGAR CLIENTE");
			e.printStackTrace();
		} catch (ExcepcionTransaccion e) {
			msg = ConstantsString.ERROR_ANYADIR_CLIENTE;
			vistaSecundaria.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println("ERROR AL AGREGAR CLIENTE");
			e.printStackTrace();
		}
	}

	/**
	 * Crea una nueva historia para que sea persistida despu&eacute;s.
	 * 
	 * @param historia
	 */
	public static void nuevaHistoria(Historial historia) {
		cierraVistaAnadir_info(ConstantsString.ANYADIR_HISTORIA);
		vistaSecundaria.nuevaHistoria(-1, historia);
		vistaSecundaria.actualizaTabla();
	}

	/**
	 * Crea un nuevo hobbie para que sea persistido despu&eacute;s.
	 * 
	 * @param hobbie
	 */
	public static void nuevoHobbie(Hobbie hobbie) {
		cierraVistaAnadir_info(ConstantsString.ANYADIR_HOBBIE);
		vistaSecundaria.nuevoHobbie(-1, hobbie);
		vistaSecundaria.actualizaTabla();
	}

	/**
	 * 
	 */
	public static void reiniciaSesion() {
		SingletonConnectionManager.getInstance().setSessionNull();
	}

	/**
	 * @param i
	 */
	public static void salir(int i) {
		System.exit(i);
	}

	/**
	 * 
	 */
	public static void show() {
		vistaPrincipal.pack();
		vistaPrincipal.setVisible(true);
	}

	/**
	 * @param modo
	 * 
	 * @see ModoFormParamConsulta
	 */
	public static void showFormParams(ModoFormParamConsulta modo) {
		switch (modo) {
		case M_RESIDENCIA:
			vistaParamResidencia.setVisible(true);
			break;
		case M_TRABAJO:
			vistaParamTrabajo.setVisible(true);
			break;
		case M_ALIMENTO:
			vistaParamAlimento.setVisible(true);
			break;
		case M_HIGIENE:
			vistaParamHigiene.setVisible(true);
			break;
		case M_PERJUDICIAL:
			vistaParamPerjudicial.setVisible(true);
		}
	}

	/**
	 * @param modo
	 * 
	 * @see ModoAnadir
	 */
	public static void showVistaAnadir(ModoAnadir modo, Object datos) {
		vistaAnadir = new FormAnadir(vistaSecundaria, modo);
		if (modo == ModoAnadir.M_ED_HECHO) {
			vistaAnadir.rellenaHistoria((Historial) datos);
		} else if (modo == ModoAnadir.M_ED_HOBBIE) {
			vistaAnadir.rellenaHobbie((Hobbie) datos);
		}
		vistaAnadir.pack();
		vistaAnadir.setVisible(true);
	}

	/**
	 * @param modo
	 * 
	 * @see ModoFormSecundario
	 */
	public static void showVistaSecundaria(ModoFormSecundario modo) {
		try {
			hobbiesDelete = new ArrayList<String>();
			historiasDelete = new ArrayList<Integer>();
			Persona p;
			DatosCliente datosCliente;
			vistaSecundaria = new FormSecundario(vistaPrincipal, modo);
			if (modo == ModoFormSecundario.M_NUEVO) {
				vistaSecundaria.actualizaTabla();
			} else {
				p = motorConsulta.obtenPersona();
				datosCliente = new DatosCliente(p,
						motorConsulta.obtenTodasHistorias(),
						motorConsulta.obtenTodosHobbies());
				vistaSecundaria.setDatosCliente(datosCliente);
				if (modo == ModoFormSecundario.M_CONSULTAR) {
					habilitaVistasParams();
					vistaSecundaria.rellenaConsulta();
					siguiente(1);
				} else {
					vistaSecundaria.rellenaCampos();
					vistaSecundaria.actualizaTabla();
				}
			}
			vistaSecundaria.pack();
			vistaSecundaria.setVisible(true);
		} catch (ExcepcionTransaccion e) {
			String msg = ConstantsString.ERROR_VER_CLIENTE;
			String titulo = ConstantsString.TITULO_ERROR;
			vistaSecundaria.ventanaInfo(msg + "\n" + e.getMessage(), titulo);
			System.err.println("ERROR AL MOSTRAR DATOS DEL CLIENTE");
			e.printStackTrace();
		}
	}

	/**
	 * Realiza la inferencia en el nivel dado.
	 * 
	 * @param nivelInferencia
	 */
	public static void siguiente(int nivelInferencia) {
		ArrayList<String> vArgs = new ArrayList<String>();
		try {
			switch (nivelInferencia) {
			case 1:
				PerfilPersona pP;
				pP = motorConsulta.obtenPerfilPersona(Controlador.dni);
				PerfilClinico pC = motorConsulta
						.obtenPerfilClinico(Controlador.dni);
				vArgs.add(pP.getCategoriaSocial());
				vArgs.add(pP.getCategoriaEconomica());
				vArgs.add(pP.getCategoriaCultural());
				vArgs.add(pP.getCategoriaProfesional());
				vArgs.add(pC.getSistemaMuscular());
				vArgs.add(pC.getSistemaOseo());
				vArgs.add(pC.getSistemaArticular());
				vArgs.add(pC.getSistemaNervioso());
				vArgs.add(pC.getSistemaDigestivo());
				vArgs.add(pC.getSistemaExcretor());
				vArgs.add(pC.getSistemaTegumentario());
				vArgs.add(pC.getSistemaInmunitario());
				vArgs.add(pC.getSistemaReproductor());
				vArgs.add(pC.getSistemaRespiratorio());
				vArgs.add(pC.getSistemaCardiovascular());
				vArgs.add(pC.getSistemaLinfatico());
				vArgs.add(pC.getEstadoMental());
				break;
			case 2:
				CondicionesResidencia condR = null;
				CondicionesTrabajo condT = null;
				HabitosAlimenticios hA = null;
				HabitosHigienicos hH = null;
				HabitosPerjudiciales hP = null;
				Persona per = motorConsulta.obtenPersona();
				if (per.getCondicionesResidencias() != null) {
					condR = per.getCondicionesResidencias().iterator().next();
				}
				vArgs.add(String.valueOf(condR.getTemperaturaMedia()));
				vArgs.add(condR.getHumedad());
				vArgs.add(String.valueOf(condR.getHorasSol()));
				vArgs.add(condR.getCalidadAire());
				vArgs.add(condR.getContaminacionAcustica());

				if (per.getCondicionesTrabajos() != null) {
					condT = per.getCondicionesTrabajos().iterator().next();
				}
				vArgs.add(String.valueOf(condT.getTemperaturaMedia()));
				vArgs.add(condT.getHumedad());
				vArgs.add(String.valueOf(condT.getHorasSol()));
				vArgs.add(condT.getCalidadAire());
				vArgs.add(condT.getContaminacionAcustica());
				vArgs.add(condT.getEsfuerzoFisico());
				vArgs.add(condT.getVertidos());

				if (per.getHabitosAlimenticioses() != null) {
					hA = per.getHabitosAlimenticioses().iterator().next();
				}
				vArgs.add(hA.getConsumoCerealesfeculas());
				vArgs.add(hA.getConsumoFrutasverduras());
				vArgs.add(hA.getConsumoGrasaslipidos());
				vArgs.add(hA.getConsumoCarne());
				vArgs.add(hA.getConsumoPescado());
				vArgs.add(hA.getConsumoLacteoshuevos());
				vArgs.add(hA.getConsumoAgua());
				vArgs.add(String.valueOf(hA.getNumComidasDia()));

				if (per.getHabitosHigienicoses() != null) {
					hH = per.getHabitosHigienicoses().iterator().next();
				}
				vArgs.add(hH.getHigieneCorporal());
				vArgs.add(hH.getHigieneBucal());
				vArgs.add(hH.getHigieneVestimenta());
				vArgs.add(hH.getHigieneAlimentos());
				vArgs.add(hH.getHigieneVivienda());

				if (per.getHabitosPerjudicialeses() != null) {
					hP = per.getHabitosPerjudicialeses().iterator().next();
				}
				vArgs.add(hP.getToxicos());
				vArgs.add(hP.getSedentarismo());
				vArgs.add(hP.getDefectosPosturales());
				vArgs.add(hP.getNivelEstres());
				vArgs.add(String.valueOf(hP.getHorasSuenyoDia()));

				vArgs.add("FinParams");

				ArrayList<String> lista = motorConsulta
						.obtenHechosSintomas(Controlador.dni);
				for (int i = 0; i < lista.size(); i++) {
					vArgs.add(StringsHP_BD.sintomaHP((String) lista.get(i)));
				}
				vArgs.add("Fin2");
				break;
			case 3:
				ArrayList<Patologias> lista2 = motorConsulta
						.obtenPatologias(Controlador.dni);
				Collections.sort(lista2);
				for (int i = 0; i < lista2.size(); i++) {
					Patologias p = (Patologias) lista2.get(i);
					vArgs.add(StringsHP_BD.descripcionHechoHP(p
							.getHechoClinico().getDescripcion()));
					vArgs.add(p.getEstado());
					vArgs.add(StringsHP_BD.gravedadHechoHP(p.getHechoClinico()
							.getGravedad()));
					if (p.getCosteTratamiento() == 1) {
						vArgs.add(String.valueOf(p.getCosteTratamiento())
								+ " euro");
					} else {
						vArgs.add(String.valueOf(p.getCosteTratamiento())
								+ " euros");
					}
				}
				vArgs.add("Fin3");
				break;
			case 4:
				ArrayList<Resultado> lista3 = motorConsulta.dameResultados();
				Collections.sort(lista3);
				for (int i = 0; i < lista3.size(); i++) {
					Resultado p = (Resultado) lista3.get(i);
					vArgs.add(StringsHP_BD.descripcionHechoHP(p
							.getHechoClinico().getDescripcion()));
					vArgs.add(StringsHP_BD.conclusionHP(p.getConclusion()));
					vArgs.add(p.getTiempoMeses() + " meses");
					vArgs.add(p.getPorcentaje() + "%");
				}
				vArgs.add("Fin4");
				if (Controlador.formLogDesp != null) {
					Controlador.formLogDesp.finalizaInferencia();
				}
			}
			vistaSecundaria.imprimeResultadoLog(vArgs);
			if (formLogDesp != null) {
				formLogDesp.repaint();
			}
		} catch (ExcepcionTransaccion e) {
			vistaAnadir.ventanaInfo(ConstantsString.ERROR_CONSULTAR,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL CONSULTAR");
			e.printStackTrace();
		}
	}

	/* PRIVADOS */
	private static void cierraVistaAnadir_info(String msg) {
		vistaAnadir.ventanaInfo(msg, ConstantsString.TITULO_INFO);
		vistaAnadir.dispose();
	}

	private static void cierraVistaAuxiliar_info(String msg) {
		vistaSecundaria.ventanaInfo(msg, ConstantsString.TITULO_INFO);
		vistaSecundaria.dispose();
	}

	private static void habilitaVistasParams() {
		vistaParamResidencia = new FormParamConsulta(vistaSecundaria,
				ModoFormParamConsulta.M_RESIDENCIA);
		vistaParamTrabajo = new FormParamConsulta(vistaSecundaria,
				ModoFormParamConsulta.M_TRABAJO);
		vistaParamAlimento = new FormParamConsulta(vistaSecundaria,
				ModoFormParamConsulta.M_ALIMENTO);
		vistaParamHigiene = new FormParamConsulta(vistaSecundaria,
				ModoFormParamConsulta.M_HIGIENE);
		vistaParamPerjudicial = new FormParamConsulta(vistaSecundaria,
				ModoFormParamConsulta.M_PERJUDICIAL);

	}

	/**
	 * @param tipo
	 * @param sistema
	 * @param descripcion
	 * @return
	 */
	public static int obtenerCodigoHecho(String tipo, String sistema,
			String descripcion) {
		try {
			return motorConsulta.obtenCodigoHecho(tipo, sistema, descripcion);
		} catch (ExcepcionTransaccion e) {
			vistaAnadir.ventanaInfo(ConstantsString.ERROR_ANYADIR_HECHO,
					ConstantsString.TITULO_ERROR);
			System.err.println(ConstantsString.ERROR_ANYADIR_HECHO);
			e.printStackTrace();
		}
		return 0;
	}

	/**
	 * @param codigo
	 * @return
	 */
	public static HechoClinico obtenerHecho(int codigo) {
		try {
			return motorConsulta.obtenHecho(codigo);
		} catch (ExcepcionTransaccion e) {
			vistaAnadir.ventanaInfo(ConstantsString.ERROR_ANYADIR_HECHO,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL OBTENER HECHO");
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * @param tipo
	 * @param sistema
	 * @return
	 */
	public static List<HechoClinico> obtenerHechos(String tipo, String sistema) {
		try {
			return motorConsulta.obtenHechos(tipo, sistema);
		} catch (ExcepcionTransaccion e) {
			vistaAnadir.ventanaInfo(ConstantsString.ERROR_ANYADIR_HECHO,
					ConstantsString.TITULO_ERROR);
			System.err.println("ERROR AL OBTENER LISTA DE HECHOS");
			e.printStackTrace();
		}
		return null;
	}

}
